home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Games Collection 1 / software vault.zip / software vault / CDR10 / ACK3D.ZIP / ENGINE / ACKSND.C < prev    next >
Text File  |  1993-08-23  |  7KB  |  315 lines

  1. /******************* ( Animation Construction Kit 3D ) ***********************/
  2. /* Sound Routines: play CMF, VOC files in background on SB, Adlib or speaker */
  3. /* CopyRight (c) 1993  Authors: Lary Myers & Frank Sachse             */
  4. /*****************************************************************************/
  5.  
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <dos.h>
  9. #include <mem.h>
  10. #include <alloc.h>
  11. #include <io.h>
  12. #include <fcntl.h>
  13. #include <time.h>
  14. #include <string.h>
  15. #include <sys\stat.h>
  16.  
  17. #include "ack3d.h"
  18. #include "ackeng.h"
  19. #include "ackext.h"
  20.  
  21. #include "acksnd.h"
  22. #include "worx.h"
  23.  
  24. static int SoundDevice;
  25.  
  26. void AckPlayNoSound(int index);
  27. void AckPlayPCSpeaker(int index);
  28. void AckPlayAdlib(int index);
  29. void AckPlaySoundBlaster(int index);
  30. int AckPlayMusic(char *MusicFile);
  31.  
  32. int IRQ; /* SB */
  33.         char    far *Cmf;
  34.         char    far *VocTable[SOUND_MAX_INDEX+1];
  35.  
  36.  
  37. /****************************************************************************
  38. ** Call into here by the application before using any of the sound routines**
  39. ** The default sound device can be used as an overide, such as when the       **
  40. ** application or user doesn't want any sound.                             **
  41. ****************************************************************************/
  42. int AckSoundInitialize(int DefaultSoundDevice)
  43. {
  44.  
  45. if (DefaultSoundDevice == DEV_NOSOUND)
  46.     {
  47.     SoundDevice = DefaultSoundDevice;
  48.     return(0);
  49.     }
  50.  
  51. /* Checks for sound board & sets SoundDevice to DEV_ define in ACKSND.H */
  52.  
  53. if (DefaultSoundDevice == DEV_PCSPEAKER)
  54.     {
  55.     SoundDevice = DefaultSoundDevice;
  56.     return(0);
  57.     }
  58.  
  59. if (AdlibDetect())
  60.     {
  61.     SoundDevice = DEV_ADLIB;
  62.     SetFMVolume(0xf,0xf);
  63.     }
  64. else
  65.     SoundDevice = DEV_PCSPEAKER;
  66.  
  67. if (DefaultSoundDevice == DEV_ADLIB)
  68.     {
  69.     SoundDevice = DEV_ADLIB;
  70.     return(0);
  71.     }
  72.  
  73. if (WorxPresent())  /* use only with WORXlite */
  74.     {
  75.     SoundDevice = DEV_SOUNDBLASTER;
  76.     SetMasterVolume(0xf,0xf);
  77.     SetVOCVolume(0xf,0xf);
  78.     }
  79.  
  80. return(0);
  81. }
  82.  
  83. /****************************************************************************
  84. ** Here the application can call in and load the VOC files that it needs   **
  85. **                                       **
  86. ****************************************************************************/
  87. int AckLoadSound(int VocIndex,char *VocFile)
  88. {
  89.     char    buf[81];
  90.  
  91. if (SoundDevice == DEV_NOSOUND)
  92.     return(0);
  93.  
  94. if (VocIndex < 0 || VocIndex > SOUND_MAX_INDEX)
  95.     return(-1);     /* index out of range */
  96.  
  97. strcpy(buf,VocFile);
  98. strtok(buf,".");
  99.  
  100. switch (SoundDevice)
  101.     {
  102.     case DEV_SOUNDBLASTER:
  103.     strcat(buf,".VOC");  /* force extension */
  104.     break;
  105.  
  106.     case DEV_ADLIB:  /* adlib can't play voc's -> put thru pc spkr */
  107.     case DEV_PCSPEAKER:
  108.     #if 0
  109.     strcat(buf,".PWM");  /* force extension */
  110.     #endif
  111.     strcat(buf,".VOC");  /* force extension */
  112.     break;
  113.  
  114.     default:
  115.     return(-2);  /* Error if unknown device */
  116.     }
  117.  
  118. VocTable[VocIndex] = LoadOneShot(buf);    /* load voc/pwm into mem */
  119.  
  120. if (VocTable[VocIndex] == NULL)
  121.     return(-2);     /* file not found */
  122.  
  123. return(0);
  124. }
  125.  
  126. /****************************************************************************
  127. **                                       **
  128. ****************************************************************************/
  129. void AckStopBackground(void)
  130. {
  131.  
  132. switch (SoundDevice)
  133.     {
  134.  
  135.     case DEV_NOSOUND:
  136.     break;
  137.  
  138.     case DEV_PCSPEAKER:
  139.     break;
  140.  
  141.     case DEV_SOUNDBLASTER:
  142.     if (SequencePlaying())
  143.         StopSequence();
  144.     break;
  145.  
  146.     case DEV_ADLIB:
  147.     if (SequencePlaying())
  148.         StopSequence();
  149.     break;
  150.  
  151.     default:
  152.     break;
  153.     }
  154.  
  155. }
  156.  
  157.  
  158. /****************************************************************************
  159. ** The Application would call this routine to begin playing background       **
  160. ** music.                                   **
  161. **                                       **
  162. ****************************************************************************/
  163. int AckPlayBackground(char *MusicFile)
  164. {
  165.     int        result = 0;
  166.  
  167. switch (SoundDevice)
  168.     {
  169.  
  170.     case DEV_NOSOUND:
  171.     break;
  172.  
  173.     case DEV_PCSPEAKER:
  174.     break;
  175.  
  176.     case DEV_SOUNDBLASTER:
  177.     result = AckPlayMusic(MusicFile);
  178.     break;
  179.  
  180.     case DEV_ADLIB:
  181.     result = AckPlayMusic(MusicFile);
  182.     break;
  183.  
  184.     default:
  185.     break;
  186.     }
  187.  
  188. return(result);
  189. }
  190.  
  191.  
  192. /****************************************************************************
  193. ** Start the music file playing in this routine.               **
  194. **                                       **
  195. ****************************************************************************/
  196. int AckPlayMusic(char *MusicFile)
  197. {
  198.     char *BufPtr;
  199.     char buf[81];
  200.  
  201. strcpy(buf,MusicFile);
  202. strtok(buf,".");                /* force CMF extention */
  203. strcat(buf,".CMF");
  204.  
  205. Cmf = GetSequence(buf);                   /* load cmf into mem */
  206.  
  207. if(Cmf==NULL)
  208.     return(1);
  209.  
  210. SetLoopMode(1);                     /* set for continuous play */
  211. PlayCMFBlock(Cmf);                  /* play background cmf */
  212.  
  213. return(0);
  214. }
  215.  
  216.  
  217. /****************************************************************************
  218. ** Call into here to play a particular sound. The indexes available are       **
  219. ** listed in ACKSND.H which will be included by the application.       **
  220. **                                       **
  221. ****************************************************************************/
  222. void AckPlaySound(int SoundIndex)
  223. {
  224.  
  225. switch (SoundDevice)
  226.     {
  227.  
  228.     case DEV_NOSOUND:
  229.     break;
  230.  
  231.     case DEV_PCSPEAKER:
  232.     AckPlayPCSpeaker(SoundIndex);
  233.     break;
  234.  
  235.     case DEV_SOUNDBLASTER:
  236.     AckPlaySoundBlaster(SoundIndex);
  237.     break;
  238.  
  239.     case DEV_ADLIB:  /* can't play VOC's on Adlib -> play thru speaker */
  240.     AckPlayPCSpeaker(SoundIndex);
  241.     break;
  242.  
  243.     default:
  244.     break;
  245.     }
  246.  
  247. }
  248.  
  249.  
  250. /****************************************************************************
  251. ** This routine is used for simple speaker sounds. The ones here are for   **
  252. ** testing at this point. Better ones would be need to be in the final       **
  253. ** version.                                   **
  254. ****************************************************************************/
  255. /* I will adjust this later to play VOC's thru speaker x*/
  256. void AckPlayPCSpeaker(int index)
  257. {
  258.  
  259. if (VocTable[index] == NULL || index < 0 || index > SOUND_MAX_INDEX)
  260.     return;
  261.  
  262. PlayPWMBlock(VocTable[index]);
  263.  
  264. }
  265.  
  266.  
  267. /****************************************************************************
  268. ** Sound Blaster routines go here.                       **
  269. **                                       **
  270. **                                       **
  271. ****************************************************************************/
  272. void AckPlaySoundBlaster(int index)
  273. {
  274.  
  275. if (VocTable[index] == NULL || index < 0 || index > SOUND_MAX_INDEX)
  276.     return;
  277.  
  278. PlayVOCBlock(VocTable[index],255);
  279.  
  280. }
  281.  
  282.  
  283. /****************************************************************************
  284. ** Call into here by the application before exiting.               **
  285. ****************************************************************************/
  286. void AckSoundShutdown(void)
  287. {
  288.  
  289. switch (SoundDevice)
  290.     {
  291.  
  292.     case DEV_NOSOUND:
  293.     break;
  294.  
  295.     case DEV_PCSPEAKER:
  296.     break;
  297.  
  298.     case DEV_SOUNDBLASTER:
  299.     if (SequencePlaying())
  300.     StopSequence();                 /* stop background CMF, if playing */
  301.     DSPClose();                      /* free Sound Blaster DSP */
  302.     break;
  303.  
  304.     case DEV_ADLIB:
  305.     if (SequencePlaying())
  306.     StopSequence();
  307.     break;
  308.  
  309.     default:
  310.     break;
  311.     }
  312.  
  313. }
  314.  
  315.